﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.Practices.Unity;
using Triunfadores.BusinessEntities;
using Triunfadores.BusinessLogic.Service;

namespace Triunfadores.Web.Prestamos
{
    public partial class Registrar : System.Web.UI.Page
    {
        #region Declaracion de dependencias
        [Dependency]
        public IClienteService ClienteService { get; set; }

        [Dependency]
        public IPrestamoService PrestamoService { get; set; }

        [Dependency]
        public ICuotaPagoService CuotaPagoService { get; set; }

        #endregion

        protected void Page_Load(object sender, EventArgs e)
        {
            var opc = Request.QueryString["opc"];
            var idPrestamo = Request.QueryString["idPrestamo"];

            if (!Page.IsPostBack)
            {
                if (opc != null && opc.Equals("nuevo"))
                {
                    ViewState["opc"] = "nuevo";

                    var prestamo = new Prestamo()
                    {
                        //asignamos a la fecha de registro la fecha del sistema
                        FechRegistro = DateTime.Now,

                    };

                    BindingPrestamo(prestamo);

                    Cache.Insert("prestamo", prestamo);

                }
            }
        }

        #region Enlace Prestamo
        private void BindingPrestamo(Prestamo prestamo)
        {
            //asp:HiddenField
            //Representa un campo oculto que se utiliza para almacenar un valor no mostrado.
            hfIdPrestamos.Value = prestamo.Id.ToString();

            tbxFecha.Text = prestamo.FechRegistro.ToShortDateString();

            if (prestamo.Cliente!=null && prestamo.Cliente.TipoCliente.Tipo=="Socio")
            {
                lblDatosSocio.Text = prestamo.Cliente.Nombres + " " + prestamo.Cliente.Apellidos;

                tbxDniAvaldo.Enabled = false;
                btnBuscarAvalado.Enabled = false;
                lblDatosAvalado.Visible = false;
            }
            else if (prestamo.Cliente!=null)
            {
                lblDatosSocio.Text = prestamo.Cliente.Nombres + " " + prestamo.Cliente.Apellidos;

                tbxDniAvaldo.Enabled = true;
                btnBuscarAvalado.Enabled = true;
                lblDatosAvalado.Visible = true;
            }

            if (prestamo.Avalador != null)
            {
                lblDatosAvalado.Text = prestamo.Avalador.Nombres + " " + prestamo.Avalador.Apellidos;
            }

            //Cache.Insert("prestamo", prestamo);

        }
        #endregion

        #region Buscar Socio y Avalado
        protected void btnBuscarSocio_Click(object sender, EventArgs e)
        {
            //se guarda el texto ingresado en una variable
            var dni = tbxDniSocio.Text;
            //guardamo el socio encontrado en una variable
            var socio = ClienteService.FindSearchingFromClienteByDni(dni);
            //guardamos elobjeto prestamo en una variable
            var prestamo = Cache.Get("prestamo") as Prestamo;

            if (socio != null && socio.TipoCliente.Tipo=="Socio")
            {
                prestamo.Cliente = socio;
                prestamo.IdCliente = socio.Id;

                prestamo.Avalador = socio;
                prestamo.IdAvalador = socio.Id;

                //ahora le asignamo al lbl
                lblDatosSocio.ForeColor = Color.Black;
                lblDatosSocio.Text = socio.Nombres + " " + socio.Apellidos;
               
                BindingPrestamo(prestamo);

                Cache.Insert("prestamo", prestamo);

            }
            else if (socio != null)
            {
                prestamo.Cliente = socio;
                prestamo.IdCliente = socio.Id;

                lblDatosSocio.ForeColor = Color.Black;
                lblDatosSocio.Text = socio.Nombres + " " + socio.Apellidos;

                BindingPrestamo(prestamo);

                Cache.Insert("prestamo", prestamo);
            }
            else
            {
                lblDatosSocio.ForeColor=Color.Red;
                lblDatosSocio.Text = "El cliente no existe o ingreso mal el numero de Dni";
            }
        }

        protected void btnBuscarAvalado_Click(object sender, EventArgs e)
        {
            //se guarda el texto ingresado en una variable
            var dni = tbxDniAvaldo.Text;
            //guardamo el avalado encontrado en una variable
            var avalado = ClienteService.FindSearchingFromAvaladorByDni(dni);
            //guardamos elobjeto prestamo en una variable
            var prestamo = Cache.Get("prestamo") as Prestamo;

            if (avalado != null)
            {
                prestamo.Avalador = avalado;
                prestamo.IdAvalador = avalado.Id;

                //ahora le asignamo al lbl
                lblDatosAvalado.ForeColor = Color.Black;
                lblDatosAvalado.Text = avalado.Nombres + " " + avalado.Apellidos;

                BindingPrestamo(prestamo);

                Cache.Insert("prestamo", prestamo);

            }
            else
            {
                lblDatosAvalado.ForeColor = Color.Red;
                lblDatosAvalado.Text = "El cliente no existe o ingreso mal el numero de Dni";
            }
        }
        #endregion

        protected void btnGuardar_Click(object sender, EventArgs e)
        {
            if (ViewState["opc"].ToString() == "nuevo")
            {
                var prestamo = Cache.Get("prestamo") as Prestamo;

                prestamo.FechRegistro = DateTime.Parse(tbxFecha.Text);
                prestamo.NroCuotas = Int32.Parse(tbxNroCuotas.Text);
                prestamo.Monto = decimal.Parse(tbxMonto.Text);
                prestamo.PeriodoPago = ddlIntervalo.SelectedValue;
                prestamo.TasaInteres = decimal.Parse(tbxInteres.Text);
                prestamo.Total = decimal.Parse(lblTotalPrestamo.Text);

                PrestamoService.AddPrestamo(prestamo);

                #region agregamos la cuotas
                foreach (var row in lvCuotas.Items)
                {
                    var lblFecha = row.FindControl("lblFechaPago") as Label;
                    var lblMonto = row.FindControl("lblMonto") as Label;
                    var lblInteres = row.FindControl("lblInteres") as Label;
                    var lblTotal = row.FindControl("lblTotal") as Label;
                    var lblEstado = row.FindControl("lblEstado") as Label;

                    var cuota = new CuotaPago()
                    {
                        FechaPago = DateTime.Parse(lblFecha.Text),
                        Monto = decimal.Parse(lblMonto.Text),
                        Interes = decimal.Parse(lblInteres.Text),
                        Total = decimal.Parse(lblTotal.Text),
                        Estado = lblEstado.Text,

                        IdPrestamo = prestamo.Id
                    };

                    CuotaPagoService.AddCuotaPago(cuota);
                }
                #endregion

                Response.Redirect("~/Default.aspx");
            }
        }

        #region Cuotas de pago
        protected void btnGenerar_Click(object sender, EventArgs e)
        {
            var prestamo = Cache.Get("prestamo") as Prestamo;

            //declaramos variables donde almacenaremos el valor de los tbx
            var fecha = DateTime.Parse(tbxFecha.Text);
            var monto = decimal.Parse(tbxMonto.Text);
            var nroCuotas = Int32.Parse(tbxNroCuotas.Text);
            var interes = decimal.Parse(tbxInteres.Text);

            //monto que se va a pagar por fecha segun el numero de cuotas
            var montoSinInteres = monto / nroCuotas;
            var totalCuota = montoSinInteres + (montoSinInteres * (interes / 100));

            //para poder usar el id del objeto Prestamo
            var idPrestamo = prestamo.Id;

            var lista = new List<CuotaPago>();

            for (Int32 i = 0; i < nroCuotas; i++)
            {
                var fechCuota = CalcularFechas(fecha);

                var item = new CuotaPago()
                {
                    IdPrestamo = idPrestamo,

                    FechaPago = fechCuota,
                    Monto = montoSinInteres,
                    Interes = interes,
                    Total = totalCuota,
                    Estado = "Pendiente"
                };
                lista.Add(item);

                fecha = fechCuota;
            }

            lvCuotas.DataSource = lista;
            lvCuotas.DataBind();

        }

        private DateTime CalcularFechas(DateTime fecha)
        {
            if (ddlIntervalo.SelectedValue == "Quincenal")
            {
                fecha = fecha.AddDays(15);
            }
            else if (ddlIntervalo.SelectedValue == "Mensual")
            {
                fecha = fecha.AddMonths(1);
            }
            else
            {
                fecha = fecha.AddMonths(3);
            }

            return fecha;

        }

        #endregion

        
    }
}